Requires an access token with the
menus:write scope. See
Token to obtain a token.Path parameters
Query parameters
Omitting a scope parameter does not mean “all”: it resolves to
__ANY__ and only matches menus synced with __ANY__ for that dimension. If menus were synced per fulfillment or channel (for example TAKEAWAY and DINE_IN), send one update per scope; when no menu exists for the requested scope the response is 404. Each composed menu is keyed by fulfillment_id + store_id + channel_id + brand_id + menu.id; see Menu sync.
Request body
Same shape as a product in theproducts array on Upsert menus. The product id is set in the path parameter — omit it from the request body.
Every field is optional on update, including the fields inside pricing and availability. Omitted fields keep their current values and no defaults are applied:
pricingandavailabilitymerge field by field.{ "pricing": { "price": 2.49 } }changes only the price;modifiers,modifier_group_ids, and quantity limits stay as they are.- Arrays (
bundled_items,labels,pricing.modifiers, …) are replaced as a whole when sent. - To clear
out_of_stock_untilwhen switching back toAVAILABLE, send"out_of_stock_until": null.
products
products
Each product in the request body:
Each
availability object:Each
bundled_items entry:Example product
pricing
pricing
Product pricing in the request body:
Each object in
modifiers configures one modifier group referenced in modifier_group_ids. It accepts the same pricing fields as the parent product, plus modifier-specific fields:Example modifiers entry
Response
Returns the updated product indata — the same shape as a product in List menus, including id, name, pricing, availability, bundled_items, and metadata.